// 给你一个整数数组 nums ，其中可能包含重复元素，请你返回该数组所有可能的子集（幂集）。

// 解集 不能 包含重复的子集。返回的解集中，子集可以按 任意顺序 排列。
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsetsWithDup = function(nums) {
    let arr = [];
    let temp = [];
    for (let i = 0; i <= nums.length; i++) { //从0开始，遍历每一种长度的可能性
        for (let j = 0; j < nums.length; j++) { //在每一次从不同的下标开始扫描
            temp = [] //重置temp的值
            for (let k = j; k < i; k++) {
                temp.push(nums[k]); //每次从j开始扫描k个元素放入数组
            }
            arr.push(temp)
        }
    }
    // 去重,这里去重存在问题，两个数组直接比较==会比较引用而不是值，set也无法去重
    arr = arr.filter((item, index) => { return item.length && item.length != 0 })
    console.log(temp)
    arr = Array.from(new Set(arr))
    return arr;
};
let arr = [1, 2, 2]
console.log(subsetsWithDup(arr)[2], subsetsWithDup(arr)[5])
    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
// 注意这里采用数层去重,通过去除连续的相同项来去掉数层的重复元素
// 通过for循环回溯,中间的元素无法回溯到前面的元素,从而去掉了不同回溯线的重复数组
var subsetsWithDup = function(nums) {
    let arr = nums.sort((a, b) => { return a - b })
    let temp = [];
    let res = [];

    function fun(startindex, arr) {
        res.push(temp.slice(0));
        if (startindex > nums.length - 1) {
            return
        }
        for (let i = startindex; i < nums.length; i++) {
            if (i > startindex && nums[i] === nums[i - 1]) {
                continue
            }
            temp.push(nums[i]);
            fun(startindex + 1, arr);
            temp.pop();
        }
    }
    fun(0, arr);
    return res;
};